﻿// 版权所有：
// 文 件  名：SelectionSort.cs
// 功能描述：
// 创建标识：Seven Song(m.sh.lin0328@163.com) 2014/3/26 22:54:28
// 修改描述：
//----------------------------------------------------------------*/
using System;
using System.Collections.Generic;

using System.Text;

namespace MSL.Utility.Sort
{
    /// <summary>
    /// 选择排序
    /// </summary>
    public class SelectSort : ISort
    {
        /// <summary>
        /// 选择排序 原理如下。首先在未排序序列中找到最小（大）元素，存放到排序序列的起始位置，然后，再从剩余未排序元素中继续寻找
        /// 最小（大）元素，然后放到已排序序列的末尾。以此类推，直到所有元素均排序完毕。总共进行至多n-1次交换,复杂度 О(n²)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list">集合</param>
        public  void Desc<T>(IList<T> list) where T : IComparable
        {
            T tmp = default(T);
            for (int i = 0; i < list.Count - 1; i++)
            {
                int max = i;
                for (int j = i + 1; j < list.Count; j++)
                {
                    if (list[j].CompareTo(list[max]) > 0)
                        max = j;
                }
                if (max != i)
                {
                    tmp = list[i];
                    list[i] = list[max];
                    list[max] = tmp;
                }
            }
        }

        /// <summary>
        /// 选择排序
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list">集合</param>
        public  void Asc<T>(IList<T> list) where T : IComparable
        {
            if (list == null)
            {
                return;
            }
            T tmp = default(T);
            for (int i = 0; i < list.Count - 1; i++)
            {
                int min = i;
                for (int j = i + 1; j < list.Count; j++)
                {
                    if (list[j].CompareTo(list[min]) < 0)
                        min = j;
                }
                if (min != i)
                {
                    tmp = list[i];
                    list[i] = list[min];
                    list[min] = tmp;
                }
            }
        }
    }
}
